بنابراین، در طول چند ویدیوی اخیر،
ما به کاربر اجازه دادیم رمز عبور خود را بازنشانی کند
و سپس یک مورد جدید ایجاد کنید،
اما اکنون ما نیز می خواهیم اجازه دهیم
یک کاربر وارد شده برای به‌روزرسانی رمز عبور خود
بدون اینکه فراموشش کنم،
و به همین ترتیب بدون کل فرآیند تنظیم مجدد.
بنابراین، بیایید آن را اکنون بسازیم.
و درست مثل قبل
اجازه دهید این کار را در کنترل کننده احراز هویت خود انجام دهیم.
بنابراین، export.updatePassword.
بسیار خوب، و به همین ترتیب، مثل همیشه،
سه پارامتر Middleware ما در اینجا، و خوب است.
اکنون به یاد داشته باشید که این قابلیت به روز رسانی رمز عبور است
فقط برای کاربرانی که وارد سیستم شده اند،
اما همچنان نیاز داریم که کاربر رمز عبور فعلی خود را وارد کند،
بنابراین به منظور تایید
آن کاربر در واقع همان کسی است که می گوید.
بنابراین، فقط به عنوان یک اقدام امنیتی
زیرا تصور کنید که شخصی کامپیوتر شما را باز پیدا کند
و سپس قادر به تغییر رمزهای عبور در سایت ها باشید
که در حال حاضر باز کرده اید
بدون اینکه دوباره از شما رمز عبور خواسته شود.
و به این ترتیب اساساً شما را از سیستم خارج می کند
از تمام برنامه های موجود شما،
که البته تجربه وحشتناکی خواهد بود.
و بنابراین، به عنوان یک اقدام امنیتی، ما همیشه باید بپرسیم
برای رمز عبور فعلی قبل از به روز رسانی، بسیار خوب است.
و با در نظر گرفتن این موضوع، بیایید تمام مراحل را ترسیم کنیم
که برای پیاده سازی باید آنها را بگیریم
این قابلیت درست مثل قبل
بنابراین، ابتدا باید کاربر را دریافت کنیم
از مجموعه، اساسا.
سپس دوم، ما باید بررسی کنیم
اگر رمز ارسال شده صحیح باشد
درست.
سپس، سوم، بنابراین اگر رمز عبور صحیح است،
سپس رمز عبور را به روز کنید.
و در نهایت، ما باید دوباره کاربر را وارد کنیم،
بنابراین اساسا برای ارسال jsonwebtoken به کاربر،
اکنون با رمز عبور جدیدی که به تازگی به روز شده است وارد شده اید.
بسیار خوب، و این در واقع بسیار شبیه به
کاری که قبلا انجام دادیم،
و بنابراین من این یکی را برای شما می گذارم
به عنوان یک چالش، باشه؟
بنابراین، لطفاً سعی کنید این کار را خودتان انجام دهید،
و در صورت نیاز، البته می توانید به کد نگاهی بیندازید
که قبلا نوشتیم،
اما واقعا سعی کنید کد را خودتان بنویسید
بدون کپی زیاد، باشه؟
بنابراین، برای دیدن بقیه کدها می توانید نگاهی بیندازید
چگونه کار می کند، اما واقعاً آن را کپی نکنید، خوب؟
چون در آن صورت واقعاً یاد نخواهید گرفت، بسیار خوب.
بنابراین، ویدیو را در اینجا مکث کنید، و من شما را در یک ثانیه می بینم
با راه حل من
بسیار خوب، پس امیدوارم موفق شده باشید این را اجرا کنید
و برای اینکه کار کند، من این کار را انجام دادم.
بنابراین، مانند همیشه، ما یک متغیر کاربر جدید ایجاد می کنیم،
و در آنجا منتظر نتیجه انجام User.findById هستیم،
و حالا این شناسه واقعا از کجا آمده است؟
خوب، دوباره به یاد داشته باشید که این رمز عبور به روز رسانی فقط است
برای احراز هویت، بنابراین برای کاربرانی که وارد سیستم شده اند،
و بنابراین، در این مرحله، ما از قبل خواهیم داشت
کاربر فعلی در شی درخواست ما.
بسیار خوب، پس از میان‌افزار محافظت می‌شود.
بنابراین، req.user.id، و سپس به یاد داشته باشید
که باید صریحاً رمز عبور را بخواهیم، ​​خوب؟
زیرا به طور پیش فرض در خروجی گنجانده نشده است.
بنابراین، ما آن را در طرحواره تعریف کردیم، یادتان هست؟
و، ما در واقع به آن رمز عبور نیاز داریم
زیرا اکنون می خواهیم آن را با یکی مقایسه کنیم
که در پایگاه داده ذخیره می شود،
و برای آن، درست مانند قبل،
ما از این شیء نمونه استفاده خواهیم کرد
که ما جایی اینجا داریم
بله، پس رمز عبور را درست کنید، که در دسترس است
در تمام اسناد کاربر،
بنابراین ابتدا رمز عبور نامزد را وارد می کند،
و سپس رمز عبور واقعی کاربر، بسیار خوب.
اوه، و حالا این خطا را به من می دهد
چون البته من این را اعلام نکردم
به عنوان یک تابع ناهمگام هنوز.
بنابراین، ناهمگام، و قبل از اینکه آن را فراموش کنیم،
اجازه دهید آن را در تابع catchAsync در اینجا نیز بپیچیم.
به هر حال مثل قبل
ما اساساً می خواهیم در اینجا یک خطا ایجاد کنیم
اگر رمز عبور فعلی صحیح نیست،
و بنابراین، اجازه دهید آن را در کد بنویسیم.
بنابراین، اگر user.correctPassword نیست،
و سپس رمز عبور نامزد را به خاطر بسپارید،
و به این ترتیب که فرد در یک بدن خواهد بود،
در یک ویژگی که ما آن را رمز عبور Confirm می نامیم.
بسیار خوب، و سپس به عنوان آرگومان دوم رمز عبور واقعی،
پس این یک user.password است.
و سپس، به یاد داشته باشید که این یک تابع ناهمزمان است،
و بنابراین ما نیز باید در اینجا منتظر آن باشیم.
خوب است، بنابراین اگر رمز عبور صحیح نیست،
درست مثل همیشه، یک خطای جدید در اینجا ایجاد می کنیم.
بنابراین، AppError جدید، و این بار ما می گوییم
رمز عبور فعلی شما اشتباه است،
و سپس کد وضعیت 401 برای غیر مجاز.
باشه عالیه
حال، اگر در کد به این نقطه برسیم،
بنابراین اساساً اگر رمز عبور نیز صحیح باشد،
خوب پس ما واقعاً می توانیم رمز عبور را به روز کنیم،
و ما چگونه آنرا انجام میدهیم؟
خوب، خیلی ساده، ما قبلاً این کار را انجام دادیم.
همه ما می گوییم user.password برابر است با req.body.password،
و سپس همان، البته، برای رمز عبور تایید.
بسیار خوب، و اعتبارسنجی به صورت خودکار انجام می شود
توسط اعتبارسنجی که در طرح مشخص کردیم،
و زمانی که ما واقعا آن را ذخیره کنیم این کار انجام می شود.
بنابراین، ما منتظر user.save هستیم،
و بنابراین این بار اعتبار سنجی را خاموش نمی کنیم
زیرا، البته، ما می خواهیم اعتبار سنجی اتفاق بیفتد،
بنابراین همانطور که قبلاً گفتم، می خواهیم بررسی کنیم
که رمز عبور تایید در واقع یکسان است
به عنوان رمز عبور، درست است؟
خوب
و اکنون فقط برای اینکه واقعاً مطمئن شوید که متوجه شده اید
چرا ما کاری مانند user.findByIdAndUpdate را انجام ندادیم.
پس چرا ما این کار را نکردیم؟
و من می دانم که قبلاً بارها در این مورد صحبت کرده ام،
اما من می خواهم که شما صد در صد درک کنید
چرا ما نمی توانیم از این به روز رسانی استفاده کنیم،
و این به دو دلیل است
پس اجازه دهید دوباره به مدل خود برگردم.
بنابراین، اولین مورد است
که این اعتبار سنجی اینجا کار نمی کند، خوب؟
و این اساساً به این دلیل است که this.password تعریف نشده است
وقتی به‌روزرسانی می‌کنیم، بنابراین وقتی از Find by ID و به‌روزرسانی استفاده می‌کنیم،
زیرا در داخل، پشت صحنه،
Mongoose واقعاً شی فعلی را در حافظه نگه نمی دارد،
و بنابراین، این در اینجا کار نمی کند.
و همانطور که گفتم قبلاً در مورد آن صحبت کردم
بنابراین در واقع اینجا نیز نوشته شده است، خوب؟
اما، بسیار مهم است که به خاطر داشته باشید که از به روز رسانی استفاده نکنید
برای هر چیزی که به رمز عبور مربوط می شود، خوب است؟
بنابراین، این یکی کار نمی کند،
و همچنین، این دو از قبل ذخیره شده است
میان افزارها نیز کار نمی کنند.
بنابراین، اگر از به‌روزرسانی ساده برای به‌روزرسانی رمز عبور استفاده کنیم،
سپس آن رمز عبور رمزگذاری نمی شود،
که این اولین میان افزار است،
و سپس رمز عبورChangedAt
مهر زمانی نیز تنظیم نمی شود، خوب؟
بنابراین، هیچ کدام از اینها کار نمی کند،
و بنابراین دوباره، ما واقعاً باید این کار را انجام دهیم.
بیایید دوباره آن را اینجا قرار دهیم.
و بنابراین اکنون، (زمزمه می کند)، ما کاربر را وارد کردیم،
و توکن را برای مشتری ارسال کرد.
حالا، این در واقع چهارمین بار است
که ما همان کد را انجام دادیم،
بنابراین اساسا این قطعه کد،
و بنابراین، اکنون به سرعت این را اصلاح می کند
به عملکرد خود
اکنون، این کد در واقع همه جا یکسان نیست.
بنابراین، در اینجا ما کد وضعیت 400 را ارسال کردیم،
و ما کاربر را ارسال نمی کنیم،
اما سپس در اینجا در کنترل کننده ثبت نام،
ما در واقع یک کد وضعیت متفاوت داریم،
و ما نیز کاربر را برای مشتری ارسال کردیم، خوب؟
و بنابراین، اجازه دهید عملکرد ما در واقع آن را در ذهن داشته باشد.
بنابراین، اجازه دهید یک تابع در اینجا ایجاد کنیم،
ایجاد و ارسال توکن،
و سپس آرگومان هایی که در اینجا به آن نیاز داریم، کاربر هستند
زیرا شناسه در آنجا ذخیره می شود.
سپس، ما کد وضعیت را نیز می خواهیم،
و البته باید به شی پاسخ دسترسی داشته باشیم
برای اینکه واقعا بتوانید پاسخ ارسال کنید
برگشت به مشتری، باشه؟
و بنابراین، اساساً اکنون آنچه ما نیاز داریم این کد است.
بنابراین، بیایید آن را کپی کنیم، آن را اینجا قرار دهیم،
و سپس متغیرهای نامربوط را جایگزین کنید.
بنابراین، کاربر به سادگی کاربر نامیده می شود،
بنابراین درست مثل این، و اینجا، همان.
بنابراین، کاربر جدید نیست،
و سپس در اینجا آن را با کد وضعیت جایگزین می کنیم،
بنابراین یکی که وارد عملکرد ما می شود،
و بنابراین من حدس می زنم که در واقع آن است.
بنابراین، بیایید اکنون پیش برویم و آن را جایگزین کنیم،
بنابراین، SendToken را ایجاد کنید، و در اینجا کاربر newUser نامیده می شود،
کد وضعیت 201 است،
و سپس البته شی پاسخ.
خوب، اکنون می توانیم از شر این کد خلاص شویم،
و بیایید آن را کپی کنیم.
بسیار خوب، بنابراین در ورود به سیستم، ما البته یک نشانه نیز ارسال کردیم،
اما این بار کاربر در واقع کاربر نامیده می شود
و کد وضعیت 200 است.
و حالا بیایید این یکی را کپی کنیم.
بنابراین، مورد بعدی باید اینجا باشد و رمز عبور را بازنشانی کند،
و اینجا در واقع یکسان است،
بنابراین نام کاربر و کد 200 است،
و حالا بالاخره اینجا هم همینطور است.
و بنابراین، عملکرد رمز عبور به روز رسانی ما به پایان می رسد.
حال، برای اینکه این کار را انجام دهیم،
ما البته باید مسیر را در اینجا نیز پیاده سازی کنیم
در روتر کاربر ما
بنابراین، router.patch، و ما یک پچ انجام می دهیم
زیرا ما در واقع در حال تغییر هستیم، بنابراین در حال دستکاری هستیم
سند کاربر، و بنابراین وصله برای همین است.
و مسیر را updateMyPassword می نامند.
بنابراین، رمز عبور من است، زیرا آن است
برای کاربری که در حال حاضر وارد شده است، و سپس دوباره به خاطر بسپارید،
این فقط برای کاربرانی که وارد سیستم شده اند کار می کند،
و بنابراین باید از authController.protect استفاده کنیم،
که سپس شی کاربر را نیز قرار خواهد داد
در مورد یک شی درخواست، خوب؟
بنابراین، محافظت، و سپس authController به روز رسانی رمز عبور
که ما به تازگی ایجاد کردیم، بسیار خوب.
و بنابراین، بیایید در واقع پیش برویم و این را آزمایش کنیم، خوب؟
بنابراین، بیایید این مسیر را در اینجا کپی کنیم،
بنابراین UpdateMyPassword،
و در حال حاضر آنچه ما نیاز به ارسال در بدن است
این سه رمز عبور در واقع،
بنابراین اساسا رمز عبور فعلی است،
و فعلاً آنها را خالی می گذارم،
من فقط می خواهم فعلاً نام فیلدها را اینجا بگذارم.
بنابراین، رمز عبور فعلی و سپس فقط رمز عبور،
که اساساً جدید است،
و سپس، البته، passwordConfirm.
بسیار خوب، و اکنون در واقع باید به عنوان کاربر وارد سیستم شویم
زیرا به یاد داشته باشید، این فقط کار می کند
اگر کاربر قبلا وارد شده باشد، بسیار خوب.
و بنابراین، اجازه دهید این کار را با مدیر اینجا انجام دهیم.
و این اینجاست، باید همچنان رمز عبور فعلی باشد،
و در واقع، ما اکنون وارد شده ایم.
و به یاد داشته باشید که این نشانه اکنون ذخیره می شود
به متغیر محیطی JWT،
و بنابراین، در اینجا، به منظور احراز هویت،
اجازه دهید پس از آن در واقع از آن درست مانند قبل استفاده کنیم.
بنابراین، در این تب مجوز، توکن حامل را انتخاب می کنیم.
و سپس در واقع به طور خودکار از قبل پر می شود
این متغیر JWT
بسیار خوب، و پس از آن جایی که در واقع
شناسه کاربری قرار است از آنجا بیاید، یادتان هست؟
به هر حال، اجازه دهید اکنون رمز عبور فعلی را مشخص کنیم، بنابراین pass1234،
و سپس اجازه دهید پسورد جدید را بگوییم، خوب؟
آن را کپی کرده و اینجا قرار دهید،
اما در واقع دوباره، من می خواهم با آزمایش آن شروع کنم
با رمز عبور اشتباه تایید کنید،
فقط برای اینکه ببینیم آیا اعتبارسنجی ما هنوز کار می کند،
و اکنون مسیر مشخص نیست،
اما این فقط به این دلیل است که ما در اینجا از فعل اشتباهی استفاده می کنیم.
البته باید پچ بشه
بیایید دوباره آن را امتحان کنیم،
اما اکنون دریافتیم که رمز عبور فعلی شما اشتباه است،
اما در واقع اینطور نیست، بنابراین در واقع درست است.
بنابراین، مشکلی در کد ما وجود دارد،
بنابراین بیایید سعی کنیم نگاهی به اینجا بیندازیم.
و بله، پس در واقع مشکل اینجاست
زیرا ما نمی خواهیم رمز عبور را مقایسه یا تأیید کنیم،
البته، اما با رمز عبور فعلی.
خوب، پس این فقط یک اشکال احمقانه است، بسیار خوب،
و بنابراین اکنون باید کار کند.
بنابراین، البته، ما می خواهیم رمز عبور فعلی را با هم مقایسه کنیم
با موردی که در حال حاضر ذخیره شده است
در پایگاه داده، بسیار خوب است.
بنابراین، بیایید دوباره آن را امتحان کنیم،
و بنابراین این خطای اعتبارسنجی است که ما به دنبال آن بودیم،
بنابراین رمزهای عبور یکسان نیستند
زیرا، در واقع، آنها نیستند.
و اکنون، قبل از به‌روزرسانی رمز عبور،
بیایید فقط نگاهی به Compass در اینجا بیاندازیم.
بیایید آن را به سرعت در اینجا به روز کنیم،
و بنابراین، در حال حاضر، این رمز عبور است.
بنابراین، پایان دادن به اینجا pW1i است، خوب؟
و بنابراین، بیایید اکنون رمز عبور را به روز کنیم
و ببینید بعد از آن چه شکلی می شود، باشه؟
بنابراین، اکنون همه چیز باید درست باشد.
و در واقع، ما موفقیت و نشانه خود را به دست می آوریم، بسیار خوب.
بنابراین، اجازه دهید به سرعت تأیید کنیم که در اینجا،
و در واقع، می بینید که رمز عبور تغییر کرده است
و همچنین مهر زمانی فعلی،
بنابراین زمانی که اساساً در حال ضبط این ویدیو هستم.
بسیار خوب، و حالا، درست مثل قبل،
بیایید این تست را در اینجا انجام دهیم.
بنابراین، اساساً توکن را به عنوان یک متغیر محیطی ذخیره می کنیم.
بنابراین، فقط برای اینکه همه چیز در اینجا در Postman واقعاً کار کند.
خوب، بیایید آن را ذخیره کنیم،
رمز عبور فعلی کاربر را به روز کنید تا آن را واقعاً واضح نشان دهید،
و بله، فکر می کنم همین است.
فکر می کنم این تنها کاری است که باید انجام دهیم
به منظور به روز رسانی رمز عبور کاربر
در مرحله بعد، ما به روز رسانی سایر داده های کاربر را اجرا خواهیم کرد،
بنابراین مواردی مانند ایمیل یا رمز عبور.